{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 共享单车租车量预测——线性回归分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1、导入必要的工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np  # 矩阵操作\n",
    "import pandas as pd # SQL数据处理\n",
    "\n",
    "from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV\n",
    "\n",
    "from sklearn.metrics import mean_squared_error  #评价回归预测模型的性能\n",
    "from sklearn.metrics import r2_score\n",
    "\n",
    "import matplotlib.pyplot as plt   #画图\n",
    "import seaborn as sns\n",
    "\n",
    "# 图形出现在Notebook里而不是新窗口\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>yr</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_1</th>\n",
       "      <th>weekday_2</th>\n",
       "      <th>weekday_3</th>\n",
       "      <th>weekday_4</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>weathersit_1</th>\n",
       "      <th>weathersit_2</th>\n",
       "      <th>weathersit_3</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 34 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   yr  holiday  workingday      temp     atemp       hum  windspeed  season_1  \\\n",
       "0   0        0           0  0.355170  0.373517  0.828620   0.284606         1   \n",
       "1   0        0           0  0.379232  0.360541  0.715771   0.466215         1   \n",
       "2   0        0           1  0.171000  0.144830  0.449638   0.465740         1   \n",
       "3   0        0           1  0.175530  0.174649  0.607131   0.284297         1   \n",
       "4   0        0           1  0.209120  0.197158  0.449313   0.339143         1   \n",
       "\n",
       "   season_2  season_3  ...  weekday_1  weekday_2  weekday_3  weekday_4  \\\n",
       "0         0         0  ...          0          0          0          0   \n",
       "1         0         0  ...          0          0          0          0   \n",
       "2         0         0  ...          1          0          0          0   \n",
       "3         0         0  ...          0          1          0          0   \n",
       "4         0         0  ...          0          0          1          0   \n",
       "\n",
       "   weekday_5  weekday_6  weathersit_1  weathersit_2  weathersit_3   cnt  \n",
       "0          0          1             0             1             0   985  \n",
       "1          0          0             0             1             0   801  \n",
       "2          0          0             1             0             0  1349  \n",
       "3          0          0             1             0             0  1562  \n",
       "4          0          0             1             0             0  1600  \n",
       "\n",
       "[5 rows x 34 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# path to where the data lies\n",
    "#dpath = './data/'\n",
    "data = pd.read_csv(\"FE_bikeshare_cnt.csv\")\n",
    "\n",
    "#通过观察前5行，了解数据每列（特征）的概况\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 34 columns):\n",
      " #   Column        Non-Null Count  Dtype  \n",
      "---  ------        --------------  -----  \n",
      " 0   yr            731 non-null    int64  \n",
      " 1   holiday       731 non-null    int64  \n",
      " 2   workingday    731 non-null    int64  \n",
      " 3   temp          731 non-null    float64\n",
      " 4   atemp         731 non-null    float64\n",
      " 5   hum           731 non-null    float64\n",
      " 6   windspeed     731 non-null    float64\n",
      " 7   season_1      731 non-null    int64  \n",
      " 8   season_2      731 non-null    int64  \n",
      " 9   season_3      731 non-null    int64  \n",
      " 10  season_4      731 non-null    int64  \n",
      " 11  mnth_1        731 non-null    int64  \n",
      " 12  mnth_2        731 non-null    int64  \n",
      " 13  mnth_3        731 non-null    int64  \n",
      " 14  mnth_4        731 non-null    int64  \n",
      " 15  mnth_5        731 non-null    int64  \n",
      " 16  mnth_6        731 non-null    int64  \n",
      " 17  mnth_7        731 non-null    int64  \n",
      " 18  mnth_8        731 non-null    int64  \n",
      " 19  mnth_9        731 non-null    int64  \n",
      " 20  mnth_10       731 non-null    int64  \n",
      " 21  mnth_11       731 non-null    int64  \n",
      " 22  mnth_12       731 non-null    int64  \n",
      " 23  weekday_0     731 non-null    int64  \n",
      " 24  weekday_1     731 non-null    int64  \n",
      " 25  weekday_2     731 non-null    int64  \n",
      " 26  weekday_3     731 non-null    int64  \n",
      " 27  weekday_4     731 non-null    int64  \n",
      " 28  weekday_5     731 non-null    int64  \n",
      " 29  weekday_6     731 non-null    int64  \n",
      " 30  weathersit_1  731 non-null    int64  \n",
      " 31  weathersit_2  731 non-null    int64  \n",
      " 32  weathersit_3  731 non-null    int64  \n",
      " 33  cnt           731 non-null    int64  \n",
      "dtypes: float64(4), int64(30)\n",
      "memory usage: 194.3 KB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从原始数据中分离输入特征x和输出y\n",
    "y = data[\"cnt\"]\n",
    "\n",
    "X = data.drop([\"cnt\"], axis = 1)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train samples: (584, 33)\n"
     ]
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, train_size=0.8)\n",
    "\n",
    "feat_names = X_train.columns\n",
    "print(\"train samples:\", X_train.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3、确定模型类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1 尝试缺省参数的线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE on Training set: 745.2803818716415\n",
      "RMSE on Test set: 815.7663314227875\n",
      "r2_score on Training set: 0.8506372887570783\n",
      "r2_score on Test set: 0.8274013801511464\n"
     ]
    }
   ],
   "source": [
    "# 线性回归\n",
    "#class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)\n",
    "\n",
    "\n",
    "# 1.使用默认配置初始化学习器实例\n",
    "lr = LinearRegression()\n",
    "\n",
    "# 2.用训练数据训练模型参数\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "# 3. 用训练好的模型对测试集进行预测\n",
    "y_test_pred = lr.predict(X_test)\n",
    "y_train_pred = lr.predict(X_train)\n",
    "\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "#fs = pd.DataFrame({\"columns\":list(feat_names), \"coef\":list((lr.coef_.T))})\n",
    "#fs.sort_values(by=['coef'],ascending=True)\n",
    "\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred))\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred))\n",
    "\n",
    "print ('RMSE on Training set:',rmse_train)\n",
    "print ('RMSE on Test set:',rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train, y_train_pred)\n",
    "r2_score_test = r2_score(y_test, y_test_pred)\n",
    "print(\"r2_score on Training set:\", r2_score_train)\n",
    "print(\"r2_score on Test set:\", r2_score_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 正则化的线性回归（L2正则 --> 岭回归）\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE on Training set: 747.3372229276231\n",
      "RMSE on Test set: 807.6425059242898\n",
      "r2_score on Training set: 0.8498117221810033\n",
      "r2_score on Test set: 0.8308219168674108\n",
      "best alpha 0.0379269019073225\n",
      "cv of rmse: [ 793.65231811  792.35339288  790.9124027   789.52627143  788.35025751\n",
      "  787.92811362  790.51406907  803.32835032  844.45963706  942.19004594\n",
      " 1108.36951377 1315.65215088 1519.53860174 1684.25189611 1795.65105167\n",
      " 1861.17556915 1896.37007819 1914.32223085 1923.234169   1927.59820953]\n"
     ]
    }
   ],
   "source": [
    "#岭回归／L2正则\n",
    "#class sklearn.linear_model.RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, \n",
    "#                                  normalize=False, scoring=None, cv=None, gcv_mode=None, \n",
    "#                                  store_cv_values=False)\n",
    "n_alphas = 20\n",
    "alphas = np.logspace(-3,3,n_alphas)\n",
    "\n",
    "ridge = RidgeCV(alphas=alphas, normalize=True, store_cv_values=True)  \n",
    "ridge.fit(X_train, y_train)   \n",
    "y_test_pred = ridge.predict(X_test)\n",
    "y_train_pred = ridge.predict(X_train)\n",
    "\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred))\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred))\n",
    "\n",
    "print ('RMSE on Training set:',rmse_train)\n",
    "print ('RMSE on Test set:',rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train, y_train_pred)\n",
    "r2_score_test = r2_score(y_test, y_test_pred)\n",
    "\n",
    "print(\"r2_score on Training set:\", r2_score_train)\n",
    "print(\"r2_score on Test set:\", r2_score_test)\n",
    "\n",
    "print(\"best alpha\",ridge.alpha_)\n",
    "\n",
    "#交叉炎症估计的测试误差\n",
    "mse_cv = np.mean(ridge.cv_values_, axis = 0)\n",
    "rmse_cv = np.sqrt(mse_cv)\n",
    "print(\"cv of rmse:\", rmse_cv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "coefs = pd.Series(ridge.coef_, index = feat_names)\n",
    "\n",
    "#正系数值的10个特征和负系数值最小的10个特征\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10), coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the Ridge Model\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "mse_mean = np.mean(ridge.cv_values_, axis = 0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas),1))\n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 正则化的线性回归（L1正则 --> Lasso）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best alpha: 1.654931923606331\n",
      "cv of rmse: [1922.88560696 1894.49592994 1853.47777945 1799.46433796 1731.50200447\n",
      " 1670.16136652 1614.93314158 1565.33034798 1520.88839689 1481.165445\n",
      " 1445.7428914  1414.22590387 1384.88652649 1354.07514059 1323.13426089\n",
      " 1295.12640552 1268.07715997 1243.57805165 1215.46318985 1185.06144503\n",
      " 1154.78402704 1127.70253156 1103.89138281 1082.95576832 1064.42247134\n",
      " 1048.04725939 1033.81163929 1021.42568099 1010.54862418 1001.01143583\n",
      "  992.64813073  985.11878307  978.17783852  969.53953255  960.2959542\n",
      "  952.17856677  945.35931648  936.8013066   927.3107822   919.07334137\n",
      "  912.09441828  906.01346839  900.76186724  895.49517373  889.20980939\n",
      "  883.55187662  878.51879755  873.71407338  868.68787585  863.67558572\n",
      "  858.99388226  854.84939475  851.21093743  848.11567309  845.16175075\n",
      "  842.48566886  839.59047165  836.96948194  834.21969849  831.85906465\n",
      "  829.82639137  828.08596246  826.56627911  825.25121488  823.88117776\n",
      "  822.67995447  821.65008817  820.78203541  820.0520429   819.33285836\n",
      "  818.6353263   818.0346599   817.38318723  816.7626171   816.22166346\n",
      "  815.75074899  815.34054409  814.99044736  814.6938707   814.41097052\n",
      "  814.14792082  813.92105168  813.72438765  813.65475016  813.67187746\n",
      "  813.70732314  813.75089302  813.79958809  813.85288602  813.90744491\n",
      "  813.96570288  814.02363228  814.08324744  814.14209003  814.1986544\n",
      "  814.25483952  814.31141297  814.36372339  814.41492215  814.46521894]\n",
      "RMSE on Training set: 747.3372229276231\n",
      "RMSE on Test set: 807.6425059242898\n",
      "r2_score on Training set: 0.8502781270589223\n",
      "r2_score on Test set: 0.8311388832111156\n"
     ]
    }
   ],
   "source": [
    "lasso = LassoCV()\n",
    "\n",
    "lasso.fit(X_train, y_train) \n",
    "\n",
    "best_alpha = lasso.alpha_\n",
    "print(\"Best alpha:\", best_alpha)\n",
    "\n",
    "#模型性能:cv\n",
    "mse_cv = np.mean(lasso.mse_path_, axis = 1)\n",
    "rmse_cv = np.sqrt(mse_cv)\n",
    "print(\"cv of rmse:\", rmse_cv)\n",
    "\n",
    "y_test_pred = lasso.predict(X_test)\n",
    "y_train_pred = lasso.predict(X_train)\n",
    "\n",
    "print ('RMSE on Training set:',rmse_train)\n",
    "print ('RMSE on Test set:',rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train, y_train_pred)\n",
    "r2_score_test = r2_score(y_test, y_test_pred)\n",
    "\n",
    "print(\"r2_score on Training set:\", r2_score_train)\n",
    "print(\"r2_score on Test set:\", r2_score_test)\n",
    "\n",
    "#print(\"best alpha\",ridge.alpha_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "coefs = pd.Series(lasso.coef_, index = feat_names)\n",
    "\n",
    "#正系数值的10个特征和负系数值最小的10个特征\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10), coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the Lasso Model\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "yr              2018.615073\n",
       "holiday         -162.722290\n",
       "workingday       259.122833\n",
       "temp            2647.724064\n",
       "atemp            960.856102\n",
       "hum            -1206.672740\n",
       "windspeed      -1121.728208\n",
       "season_1        -922.666826\n",
       "season_2           0.000000\n",
       "season_3        -133.609166\n",
       "season_4         695.747911\n",
       "mnth_1          -331.701028\n",
       "mnth_2          -253.657653\n",
       "mnth_3           154.800958\n",
       "mnth_4            -0.553087\n",
       "mnth_5           242.803405\n",
       "mnth_6           198.020895\n",
       "mnth_7          -414.650999\n",
       "mnth_8            57.412145\n",
       "mnth_9           632.482635\n",
       "mnth_10          150.964647\n",
       "mnth_11         -546.183028\n",
       "mnth_12         -568.538670\n",
       "weekday_0       -180.969585\n",
       "weekday_1       -245.806921\n",
       "weekday_2        -74.376965\n",
       "weekday_3          0.000000\n",
       "weekday_4          0.000000\n",
       "weekday_5         16.289188\n",
       "weekday_6        219.130102\n",
       "weathersit_1     510.004101\n",
       "weathersit_2      -0.000000\n",
       "weathersit_3   -1699.504895\n",
       "dtype: float64"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
